/*
联立230，属于树状数组同类问题。
最重要的是数据间的关系，以核心值为基准，比如该题核心就是中间数值，需要找左边
比它小的，右边也比他小的。因此，针对左边，需要从左往右遍历，并且直接通过sum求总和。
针对右边，需要从右往左遍历，同样找小于该位置的值，因此同样通过sum直接求总和。

PS 如果需要求大于核心值的个数，可以通过sum(maxx) - sum(a[i]) 的方式间接求得。
	适用于a1<a2<a3这类情况 
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int maxx = 33000, maxn = 50010;
int a[maxn], c[maxx], pre[maxn] = {0}, post[maxn] = {0};
int lowbit(int x) {return x&-x;}
void update(int x) {
	while(x<=maxx) {
		c[x]++;
		x += lowbit(x);
	}
}
int sum(int x) {
//	小于x的元素个数和 
	int res = 0;
	while(x>0) {
		res += c[x];
		x -= lowbit(x);
	}
	return res;
}

int main() {
	int n;
	long long ans = 0;
	scanf("%d", &n);
	memset(a, 0, sizeof(a));
	memset(c, 0, sizeof(c));
	for(int i=1; i<=n; i++)	scanf("%d", &a[i]), a[i]++;
	for(int i=1; i<=n; i++) {
		update(a[i]);
		pre[i] = sum(a[i] - 1);
	}
	memset(c, 0, sizeof(c));
	for(int i=n; i>0; i--) {
		update(a[i]);
		post[i] = sum(a[i] - 1);
	}
	for(int i=1; i<=n; i++)
		ans += pre[i] * post[i];
	printf("%lld", ans);
	return 0;
}